package com.h2cloud.annotation.jpa;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * @Package: com.h2cloud.annotation.jpa
 * @ClassName: JpaTest
 * @Author: h2cloud
 * @CreateTime: 2021/8/9 9:32 下午
 * @Description:
 */
public class JpaTest {
    public static void main(String[] args) {
        new B1();
    }
}

class A1<T> {
    public A1() {
        Class<? extends A1> subClass = this.getClass();
        System.out.println("子类的 Class对象：subClass = " + subClass);

        // 得到泛型父类
        Type genericSuperclass = subClass.getGenericSuperclass();
        System.out.println("通过子类 Class，获取父类的 Class对象：genericSuperclass = " + genericSuperclass);

        // genericSuperclass 本质是 ParameterizedTypeImpl，可以向下强转
        ParameterizedType parameterizedTypeSuperclass = (ParameterizedType) genericSuperclass;

        // 强转后可用的方法变多了，比如 getActualTypeArguments()可以获取 Class A<String>的泛型的实际类型参数
        Type[] actualTypeArguments = parameterizedTypeSuperclass.getActualTypeArguments();

        // 由于A类只有一个泛型，这里可以直接通过 actualTypeArguments[0]得到子类传递的实际类型参数
        Class actualTypeArgument = (Class) actualTypeArguments[0];
        System.out.println("在父类中得到子类继承时传递的泛型的实际类型参数：actualTypeArgument = " + actualTypeArgument);
    }
}

class B1 extends A1<String> {
}

class C1 extends A1<Integer> {
}
